import { log } from "console"
import { aop } from "../function/aop/aop"
import { aop2 } from "../function/aop/aop2"
// import { TransactionManager } from "../function/db/transactionmanager"
// 切面
export function Asepect() {
    return ((target) => {
        aop.addAspect(target)
    })
}

//切点  顺带进行advice注册
export function Pointcut(expression: Array<string>, advices?: Array<Function>) {
    return (target: unknown, propertyKey: string) => {
        aop.addPointCut({
            clazz: target.constructor,
            expressions: expression,
            pointCutName: propertyKey,
        })
        if (advices) {
            aop.addAdvice(target.constructor, propertyKey, advices)
        }
    }
}

// 切面更新测试
export function Asepect2() {
    return ((target) => {
        aop2.addAspect(target)
    })
}

//切点  顺带进行advice注册
export function Pointcut2(expression: Array<string>, advices?: Array<Function>) {
    return (target: unknown, propertyKey: string) => {
        aop2.addPointCut({
            clazz: target.constructor,
            expression: expression,
            PointcutName: propertyKey,
        })
        if (advices) {
            aop2.addAdvice(target.constructor.name as string, advices)
        }
    }
}

// /**
//  * 类装饰器，用于添加事务支持。
//  * 该类的所有方法上添加事务控制。
//  *
//  * @returns 函数接受一个目标类作为参数。
//  */
// export function Transactioner() {
//     return async (target: Function) => {
//         // 将目标类添加为 AOP 框架的一个切面
//         aop.addAspect(target);

//         // 为目标类添加切点，这个切点包含了所有的方法（使用 "*" 表达式）
//         aop.addPointCut({
//             clazz: target, // 目标类
//             expressions: ["*"], // 应用于所有方法的表达式
//             pointCutName: "TransactionPointCut", // 切点名称
//             adviceArray: [ // 通知（Advice）数组，定义了事务的控制逻辑
//                 TransactionManager.beginTransaction, // 在方法执行前开始事务
//                 async (connection) => await TransactionManager.commitTransaction(connection), // 在方法执行后提交事务
//                 async (connection) => await TransactionManager.rollbackTransaction(connection) // 在方法执行出现异常时回滚事务
//             ]
//         });
//     }
// }


// /**
//  * 方法装饰器，用于在单个方法上添加事务控制。
//  * 在该方法的执行前后添加事务的开始和结束控制。
//  *
//  * @returns 返回一个函数，该函数修改目标方法的描述符。
//  */
// export function Transaction() {
//     return (target: Object, propertyName: string, propertyDesciptor: PropertyDescriptor): PropertyDescriptor => {
//         const method = propertyDesciptor.value; // 原始方法

//         // 重写原始方法
//         propertyDesciptor.value = async function (...args: any[]) {
//             let connection;
//             try {
//                 // 开始一个新的事务
//                 connection = await TransactionManager.beginTransaction();
//                 // 执行原始方法
//                 const result = await method.apply(this, args);
//                 // 提交事务
//                 await TransactionManager.commitTransaction(connection);
//                 return result; // 返回方法执行结果
//             } catch (error) {
//                 // 如果出现异常，则回滚事务
//                 if (connection) {
//                     await TransactionManager.rollbackTransaction(connection);
//                 }
//                 throw error; // 重新抛出异常
//             }
//         };

//         return propertyDesciptor; // 返回修改后的方法描述符
//     };
// }

